// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Author: wsfuyibing <682805@qq.com>
// Date: 2024-08-02

package base

import (
	"html/template"
	"sort"
)

// Table
// is a component for table definition (DDL).
type Table struct {
	// Normal fields.
	Engine    string        `xorm:"Engine"`
	Format    string        `xorm:"Row_format"`
	Name      ItemName      `xorm:"Name"`
	Comment   ItemComment   `xorm:"Comment"`
	Collation ItemCollation `xorm:"Collation"`

	// Belongs to.
	Columns       []*Column `xorm:"-"`
	PackageList   []string
	PackageMapper map[string]bool

	// Info fields.
	CommentList []template.HTML `xorm:"-"`
	Datetime    template.HTML   `xorm:"-"`
	Script      template.HTML   `xorm:"-"`

	// Execution fields.
	ConnectionKey string `xorm:"-"`
	ModelName     string `xorm:"-"`
	ModelPkg      string `xorm:"-"`
	ServiceName   string `xorm:"-"`
	ServicePkg    string `xorm:"-"`

	// Primary prop.
	PrimaryName      string `xorm:"-"`
	PrimaryFieldName string `xorm:"-"`
	PrimaryType      string `xorm:"-"`

	// Current timestamp.
	CurrentPrimaryKey     string   `xorm:"-"`
	CurrentPrimaryKeyName string   `xorm:"-"`
	CurrentPrimaryKeyType string   `xorm:"-"`
	CurrentTimestamps     []string `xorm:"-"`
	CurrentZeroTimestamps []string `xorm:"-"`
}

func (o *Table) Ready() {
	o.CurrentTimestamps = make([]string, 0)
	o.CurrentZeroTimestamps = make([]string, 0)

	for _, c := range o.Columns {
		if c.Key.IsPrimary() && o.CurrentPrimaryKey == "" {
			o.CurrentPrimaryKey = c.Field.String()
			o.CurrentPrimaryKeyName = c.Field.ToLargeCamel()
			o.CurrentPrimaryKeyType = c.ExportType
		}

		if c.Default.IsCurrentTimestamp() {
			o.CurrentTimestamps = append(o.CurrentTimestamps, c.Field.ToLargeCamel())
		}

		if c.Default.IsZeroTimestamp() {
			o.CurrentZeroTimestamps = append(o.CurrentZeroTimestamps, c.Field.ToLargeCamel())
		}
	}
}

func (o *Table) Add(pkg string) {
	if o.PackageList == nil || o.PackageMapper == nil {
		o.PackageList = make([]string, 0)
		o.PackageMapper = make(map[string]bool)
	}

	if _, ok := o.PackageMapper[pkg]; ok {
		return
	}

	o.PackageList = append(o.PackageList, pkg)
	o.PackageMapper[pkg] = true

	sort.Strings(o.PackageList)
}
